#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QHash>
#include <QItemSelectionModel>
#include <QDataWidgetMapper>
#include <QTableView>

#include "attendancequery.h"
#include "sqldatabase.h"
#include "paginationcontroller.h"

#include "attendancemanager.h"

class DatabaseManager : public QObject
{
    Q_OBJECT
public:
    explicit DatabaseManager(QTableView *tableView, QObject *parent = nullptr);


    bool initDatabase();
    void initUIComponents();

    // 数据库操作
    QStringList getTables() const;
    QStringList getTableFields(const QString &table) const;
    QSqlTableModel* getTableModel();

    // 数据操作
    static int getTotalRecords(const QString& tableName);

    static QStringList getDepartments();   // 获取所有部门
    QSqlQuery getAttendanceData(QDate queryDate, const QString &deptName);

    // 考勤打卡
    bool clockInOut(const QString &rfidCard);
    // 查询考勤统计
    QSqlQuery getAttendanceStatistics(const QString &timeRange, const QString &dept, const QString &status, const QDate &date);

    // 表头配置
    static const QHash<QString, QVector<std::pair<QString, QString>>> TABLE_HEADERS;
    static const QHash<QString, QString> TABLE_NAMES;   // 表名索引


    bool connectDatabase();
    bool checkTableExists(const QString &tableName);
    bool initDatabaseFile();
    bool checkDatabaseInit();


    void pagingQuerySql(const QString &table, int pageNumber);

//    QString getCurrentTable() const;
    QString m_currentTable; // 当前显示的表格

    void setPagination(PaginationController *pagination);

    static bool departmentExists(const QString &deptName);
    static int getDepartmentId(const QString &deptName);
    int registerEmployee(const QString &cardId, const QString &name, const QString &deptName, const QString &position);
public slots:
    void onAdd();
    void onInsert();
    void onSubmit();
    void onCancel();
    void onDelete();

    // 更新选中行
    void updateSelectedRows();

    // 刷新表格
    void refreshTable(const QString& tableName, int page = 1, int pageSize = 5);


    void do_currentRowChanged(QModelIndex current, QModelIndex perivous);
    void do_currentChanged(QModelIndex current, QModelIndex perivous);
signals:
    void tableRefreshed();
    void dataOperationError(const QString& error);
    // 转发信号
    void currentChanged(const QModelIndex &current, const QModelIndex &previous);
//    void currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
    void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
    void dirty(bool isDirty);
    void isSeletRow(bool isSelet);

    /**
     * @brief 发出未注册的员工卡号
     * @param rfidCard 员工卡号
     */
    void employeeCard(const QString &rfidCard);

    // 考勤统计数据
    void statisticsQuery(QSqlQuery query);
    // 部门考勤率
    void deptAttendance(QSqlQuery query);
private:
    SqlDatabase *m_DB;
    QSqlQueryModel *m_queryModel;   // 数据库查询模型
    QSqlTableModel *m_tableModel;   // 数据库表格模型

    QTableView *m_tableView;        // 视图模型

    QItemSelectionModel *m_theSeletion; // 选择模型

    PaginationController* m_pagination; // 页面控制

    AttendanceManager *m_attendance;    // 打卡
    AttendanceQuery *m_attendQuery;     // 考勤
};

#endif // DATABASEMANAGER_H
